package com.atguigu.tingshu.album.service.impl;

import com.atguigu.tingshu.album.mapper.AlbumAttributeValueMapper;
import com.atguigu.tingshu.album.mapper.AlbumInfoMapper;
import com.atguigu.tingshu.album.mapper.AlbumStatMapper;
import com.atguigu.tingshu.album.mapper.TrackInfoMapper;
import com.atguigu.tingshu.album.service.AlbumInfoService;
import com.atguigu.tingshu.common.constant.SystemConstant;
import com.atguigu.tingshu.common.execption.GuiguException;
import com.atguigu.tingshu.common.rabbit.constant.MqConst;
import com.atguigu.tingshu.common.rabbit.service.RabbitService;
import com.atguigu.tingshu.model.album.AlbumAttributeValue;
import com.atguigu.tingshu.model.album.AlbumInfo;
import com.atguigu.tingshu.model.album.AlbumStat;
import com.atguigu.tingshu.model.album.TrackInfo;
import com.atguigu.tingshu.query.album.AlbumInfoQuery;
import com.atguigu.tingshu.vo.album.AlbumAttributeValueVo;
import com.atguigu.tingshu.vo.album.AlbumInfoVo;
import com.atguigu.tingshu.vo.album.AlbumListVo;
import com.atguigu.tingshu.vo.album.AlbumStatVo;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;

import java.util.List;
import java.util.Map;

@Slf4j
@Service
@SuppressWarnings({"all"})
public class AlbumInfoServiceImpl extends ServiceImpl<AlbumInfoMapper, AlbumInfo> implements AlbumInfoService {

	@Autowired
	private AlbumInfoMapper albumInfoMapper;

	@Autowired
	private AlbumAttributeValueMapper albumAttributeValueMapper;

	@Autowired
	private AlbumStatMapper albumStatMapper;

	@Autowired
	private TrackInfoMapper trackInfoMapper;

	@Autowired
	private RabbitService rabbitService;

	/**
	 * 获取当前用户专辑列表（用于上传声音的时候设置属于哪个专辑）
	 * @return 一个map，
	 */
	//@Override
	//public List<AlbumInfo> findUserAllAlbumList(Long userId) {
	//	// 默认查看第一页，前100个专辑
	//	IPage<AlbumInfo> albumInfoPage = new Page<>(1,100);
	//	// 设置查询条件
	//	LambdaQueryWrapper<AlbumInfo> wrapper = new LambdaQueryWrapper<>();
	//	wrapper.select(AlbumInfo::getId,AlbumInfo::getAlbumTitle);
	//	wrapper.eq(AlbumInfo::getUserId,userId);
	//	wrapper.orderByDesc(AlbumInfo::getId);
	//	// 返回查询记录
	//	return albumInfoMapper.selectPage(albumInfoPage,wrapper).getRecords();
	//}

	@Override
	public List<AlbumInfo> findUserAllAlbumList(Long userId) {
		//创建page对象，传入当前页和每页记录数
		Page<AlbumInfo> pageParam = new Page<>(1, 100);
		// select id,album_title from album_info where user_id=1 order by id desc
		LambdaQueryWrapper<AlbumInfo> wrapper = new LambdaQueryWrapper<>();
		//指定查询字段
		wrapper.select(AlbumInfo::getId,AlbumInfo::getAlbumTitle);
		//根据userId查询
		wrapper.eq(AlbumInfo::getUserId,userId);
		//排序 专辑id desc
		wrapper.orderByDesc(AlbumInfo::getId);
		//selectPage，mybatis-plus的分页方法
		IPage<AlbumInfo> albumInfoPage =
				albumInfoMapper.selectPage(pageParam, wrapper);
		//从IPage对象里面获取数据list集合
		List<AlbumInfo> list = albumInfoPage.getRecords();

		return list;
	}

	/**
	 * 远程调用：根据专辑id获取四个统计数据
	 * @param albumId
	 * @return
	 */
	@Override
	public Map<String, Object> getAlbumInfoStat(Long albumId) {
		return albumStatMapper.getAlbumInfoStat(albumId);
	}

	/**
	 * 根据专辑id获取标签名称和标签值
	 * @param albumId
	 * @return
	 */
	@Override
	public List<AlbumAttributeValue> findAlbumAttributeValueByAlbumId(Long albumId) {
		LambdaQueryWrapper<AlbumAttributeValue> wrapper = new LambdaQueryWrapper<>();
		wrapper.eq(AlbumAttributeValue::getAlbumId,albumId);
		List<AlbumAttributeValue> albumAttributeValueList = albumAttributeValueMapper.selectList(wrapper);
		// 返回集合数据
		return albumAttributeValueList;
	}

	/**
	 * 根据专辑Id 获取到统计信息（远程调用四个接口获取）
	 * @param albumId
	 * @return
	 */
	@Override
	public AlbumStatVo getAlbumStatVoByAlbumId(Long albumId) {
		return albumStatMapper.getAlbumStatVoByAlbumId(albumId);
	}

	//修改专辑
	@Override
	public void updateAlbumInfo(Long albumId, AlbumInfoVo albumInfoVo) {
		//根据专辑id修改专辑基本信息
		AlbumInfo albumInfo = albumInfoMapper.selectById(albumId);
		BeanUtils.copyProperties(albumInfoVo,albumInfo);
		albumInfoMapper.updateById(albumInfo);

		//根据专辑id删除标签名称和标签值数据
		LambdaQueryWrapper<AlbumAttributeValue> wrapper = new LambdaQueryWrapper<>();
		wrapper.eq(AlbumAttributeValue::getAlbumId,albumId);
		albumAttributeValueMapper.delete(wrapper);

		//添加专辑下面 标签名称和标签值数据
		List<AlbumAttributeValueVo> albumAttributeValueVoList = albumInfoVo.getAlbumAttributeValueVoList();
		if(!CollectionUtils.isEmpty(albumAttributeValueVoList)) {
			albumAttributeValueVoList.stream().forEach(albumAttributeValueVo -> {
				AlbumAttributeValue albumAttributeValue = new AlbumAttributeValue();
				BeanUtils.copyProperties(albumAttributeValueVo,albumAttributeValue);
				albumAttributeValue.setAlbumId(albumId);
				albumAttributeValueMapper.insert(albumAttributeValue);
			});
		}
	}

	//根据专辑id获取专辑数据（数据回显）
	@Override
	public AlbumInfo getAlbumInfo(Long albumId) {
		//1 根据专辑id获取专辑基本信息
		AlbumInfo albumInfo = albumInfoMapper.selectById(albumId);

		//2 根据专辑id获取标签数据
		LambdaQueryWrapper<AlbumAttributeValue> wrapper = new LambdaQueryWrapper<>();
		wrapper.eq(AlbumAttributeValue::getAlbumId,albumId);
		List<AlbumAttributeValue> albumAttributeValueList = albumAttributeValueMapper.selectList(wrapper);

		//3 把获取标签数据list集合封装到专辑对象里面
		albumInfo.setAlbumAttributeValueVoList(albumAttributeValueList);

		return albumInfo;
	}

	//根据id删除专辑
	//删除专辑
	@Override
	public void removeAlbumInfo(String albumId) {
		//1 判断当前专辑下面是否包含声音，如果包含不能删除
		// select count(*) from track_info where album_id=?
		LambdaQueryWrapper<TrackInfo> queryWrapper = new LambdaQueryWrapper<>();
		queryWrapper.eq(TrackInfo::getAlbumId,albumId);
		Long count = trackInfoMapper.selectCount(queryWrapper);
		if(count > 0) {//包含声音，如果包含不能删除
			throw new GuiguException(400, "该专辑下存在未删除声音！");
		}

		//2 如果专辑下面不包含声音，可以删除
		//2.1 删除专辑基本信息
		albumInfoMapper.deleteById(albumId);

		//2.2 删除专辑标签名称和标签值数据
		LambdaQueryWrapper<AlbumAttributeValue> queryWrapper1 =
				new LambdaQueryWrapper<>();
		queryWrapper1.eq(AlbumAttributeValue::getAlbumId,albumId);
		albumAttributeValueMapper.delete(queryWrapper1);

		//2.3 删除专辑四个统计数据
		LambdaQueryWrapper<AlbumStat> queryWrapper2 =
				new LambdaQueryWrapper<>();
		queryWrapper2.eq(AlbumStat::getAlbumId,albumId);
		albumStatMapper.delete(queryWrapper2);

		//优化MQ实现专辑删除（专辑下架）
		rabbitService.sendMessage(MqConst.EXCHANGE_ALBUM, MqConst.ROUTING_ALBUM_LOWER, albumId);
	}

	//查询专辑列表
	@Override
	public IPage<AlbumListVo> selectAlbumPage(Page<AlbumListVo> pageParam, AlbumInfoQuery albumInfoQuery) {
		return albumInfoMapper.selectUserAlbumPage(pageParam,albumInfoQuery);
	}

	/**
	 * 保存专辑
	 * @param albumInfoVo 一个专辑信息的VO对象
	 * @return
	 */

	//思路：一定是三步：
	@Override
	public void saveAlbumInfo(AlbumInfoVo albumInfoVo) {
		//1 添加专辑基本信息 album_info
		AlbumInfo albumInfo = new AlbumInfo();
		// AlbumInfoVo 值--放到 AlbumInfo
		//String albumTitle = albumInfoVo.getAlbumTitle();
		//albumInfo.setAlbumTitle(albumTitle);
		BeanUtils.copyProperties(albumInfoVo,albumInfo);

		//专辑有几个值需要单独设置，前端没有传递过来的
		//TODO  userId 用户id，后面完善
		albumInfo.setUserId(1L);
		// 专辑状态，设置通过
		albumInfo.setStatus(SystemConstant.ALBUM_STATUS_PASS);
		//设置收费专辑，免费试听集数，前3集
		String payType = albumInfo.getPayType();
		if(!SystemConstant.ALBUM_PAY_TYPE_FREE.equals(payType)) {
			albumInfo.setTracksForFree(3);
		}
		//调用方法保存
		albumInfoMapper.insert(albumInfo);

		//2 添加专辑下面标签名称和标签值数据 album_attribute_value
		List<AlbumAttributeValueVo> albumAttributeValueVoList =
				albumInfoVo.getAlbumAttributeValueVoList();
		//非空判断
		if(!CollectionUtils.isEmpty(albumAttributeValueVoList)) {
			//批量添加
			albumAttributeValueVoList.stream().forEach(albumAttributeValueVo -> {
				AlbumAttributeValue albumAttributeValue = new AlbumAttributeValue();
				// AlbumAttributeValueVo --  AlbumAttributeValue
				BeanUtils.copyProperties(albumAttributeValueVo,albumAttributeValue);
				//专辑id
				albumAttributeValue.setAlbumId(albumInfo.getId());

				albumAttributeValueMapper.insert(albumAttributeValue);
			});
		}

		//3 添加专辑四个统计数据 播放量，订阅量等 初始值 0 album_stat
		//播放量
		this.saveAlbumStat(albumInfo.getId(),SystemConstant.ALBUM_STAT_PLAY);
		//订阅量
		this.saveAlbumStat(albumInfo.getId(), SystemConstant.ALBUM_STAT_SUBSCRIBE);
		//购买量
		this.saveAlbumStat(albumInfo.getId(), SystemConstant.ALBUM_STAT_BROWSE);
		//评论数
		this.saveAlbumStat(albumInfo.getId(), SystemConstant.ALBUM_STAT_COMMENT);

		//优化：使用RabbitMQ消息来实现异步操作，不需要等待
		//判断专辑是否公开，如果公开，发送mq消息，实现专辑上架
		String isOpen = albumInfo.getIsOpen();
		// 发送上架消息
		if ("1".equals(isOpen)){
			rabbitService.sendMessage(MqConst.EXCHANGE_ALBUM,
					MqConst.ROUTING_ALBUM_UPPER,
					albumInfo.getId());
		}
	}

	//保存专辑统计数据的方法
	public void saveAlbumStat(Long albumId, String statType) {
		AlbumStat albumStat = new AlbumStat();
		albumStat.setAlbumId(albumId);
		albumStat.setStatType(statType);// 0401  0402 ....0403
		albumStat.setStatNum(0);
		albumStatMapper.insert(albumStat);
	}



}
